package com.leetcode.www;

import java.util.ArrayList;
import java.util.List;

/**
 * Creared with IntelliJ IDEA.
 * Description:给你一个整数 n ，按字典序返回范围 [1, n] 内所有整数。
 *
 * 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。
 *
 *
 * User:yxd
 * Date:2022-04-18
 * Time:11:48
 */
public class Everyday386 {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> lexicalOrder(int n) {//类似于一棵树,从第一个节点向下延伸知道大于n停止
        for (int i = 1; i <= 9; i++) dfs(i, n);
        return ans;
    }
    void dfs(int cur, int limit) {
        if (cur > limit) return ;//大于就结束此子树
        ans.add(cur);
        for (int i = 0; i <= 9; i++) {
            dfs(cur * 10 + i, limit);//遍历下面的节点
        }
    }
    public List<Integer> lexicalOrder1(int n) {
        List<Integer> ret = new ArrayList<Integer>();
        int number = 1;
        for (int i = 0; i < n; i++) {
            ret.add(number);
            if (number * 10 <= n) {
                number *= 10;
            } else {
                while (number % 10 == 9 || number + 1 > n) {//字典序中9是最大的或者这个数超过n了都除10,让其小一点
                    number /= 10;
                }
                number++;//下一个
            }
        }
        return ret;
    }
}
